/**
 * @Creator: eyes
 * @Date: 2019/12/23
 * 性能统计可视化相关API
 */
import {PAGER} from '~/utils/const';
import http from './http';
import constant from './constant';

/**
 * 性能统计 核心页面
 * API介绍地址：http://api.baijia.com/project/403/interface/api/116754
 * url: /api/performance/corepage
 * @param targetType{Number} - 性能指标类型. 比如1:首屏时间
 * @param bizTypeName{String} - 业务线
 * @param bizName{String} - 项目名
 * @param path{String} - 页面路径
 * @param startTime{String} - 开始时间yyyy-MM-ddHH:mm:ss
 * @param endTime{String} - 结束时间yyyy-MM-ddHH:mm:ss
 * @param timeType{Number} - 时间显示粒度. 比如1: 一天
 */
export const getCorePagesPerformance = (
    {targetType, bizTypeName, bizName, path, startTime, endTime, timeType},
) => http.post(constant.PERFORMANCE.CORE_PAGES, {
    targetType,
    bizTypeName,
    bizName,
    path,
    startTime,
    endTime,
    timeType,
});

/**
 *
 * @param field{String} -必填项 业务线-biz_type_name,应用-biz_name,路径-path等
 * field, bizTypeName, bizName
 */

export const getFieldValueApi = param => {
    if (!Object.prototype.hasOwnProperty.call(param, 'pager')) {
        param.pager = PAGER;
    }
    return http.post(constant.Analysis.GET_FIELD_VALUES, {
        ...param
    });
};

/**
 *性能分析-性能总体特征周环比
 *
 */
export const getAnalysisFeatureDataApi = param => http.post(constant.Analysis.GET_ANALYSIS_FEATURE_DATA, {
    ...param,
});

/**
 * 性能分析-性能趋势
*/
export const getAnalysisTrendApi = param => http.post(constant.Analysis.GET_ANALYSIS_TREND, {...param});

/**
 * 性能分析-性能趋势明细数据分页
 */
export const getAnalysisTrendDetailApi = param => http.post(constant.Analysis.GET_ANALYSIS_TREND_DETAIL, {...param});

/**
 *  性能分析 性能趋势数据明细下载
 */

export const downloadTrendListApi = param => http({
    url: constant.Analysis.DOWNLOAD_TREND_LIST,
    method: 'post',
    data: {
        ...param
    },
    responseType: 'blob'
}).then(res => {
    const blob = new Blob([res], {
        type: 'application/vnd.ms-excel;'
    });
    const downloadElement = document.createElement('a');
    const href = window.URL.createObjectURL(blob);
    downloadElement.href = href;
    const time = (new Date()).getTime();
    downloadElement.download = `明细数据${time}.xlsx`;
    document.body.appendChild(downloadElement);
    downloadElement.click();
    document.body.removeChild(downloadElement);
    window.URL.revokeObjectURL(href);
});

/**
 *  性能统计 高途核心页面数据下载
 */

export const downloadCorePageApi = param => http({
    url: constant.PERFORMANCE.DOWNLOAD_CORE_PAGES,
    method: 'post',
    data: param,
    responseType: 'blob'
}).then(res => {
    const blob = new Blob([res], {
        type: 'application/vnd.ms-excel;'
    });
    const downloadElement = document.createElement('a');
    const href = window.URL.createObjectURL(blob);
    downloadElement.href = href;
    const time = (new Date()).getTime();
    downloadElement.download = `高途核心页面数据${time}.xlsx`;
    document.body.appendChild(downloadElement);
    downloadElement.click();
    document.body.removeChild(downloadElement);
    window.URL.revokeObjectURL(href);
});

/**
 * 性能分析-性能分布
 */
export const getAnalysisDistributionDataApi = param => http.post(constant.Analysis.GET_ANALYSIS_DISTRIBUTION, param);

/**
 * 性能统计 排行页面——获取查询条件业务线和应用
 * API介绍地址：http://api.baijia.com/mock/403/api/interface/filed/values
 * url: /api/performance/field/values
 * @param field{String} - 被搜索的字段名. 比如业务线-biz_type_name
 * @param keyword{String=} - 关键词, 设置后作为搜索的过滤条件
 * @param bizTypeName{String=} - 业务线, 设置后作为搜索的过滤条件
 * @param bizName{String=} - 项目名, 设置后作为搜索的过滤条件
 * @param pager{object=} -分页
 */
export const getFieldValues = (
    {
        field,
        keyword,
        bizTypeName,
        bizName,
        pager,
    },
) => http.post(constant.PERFORMANCE.RANK_PAGES_DIMENSION, {
    field,
    keyword,
    bizTypeName,
    bizName,
    pager: pager || PAGER,
});

/**
 * 性能统计 排行页面——获取表格数据
 * API介绍地址：http://api.baijia.com/mock/403/api/performance/analysis/rank
 * url: /api/performance/corepage
 * @param targetType{Number} - 性能指标类型. 比如1:首屏时间
 * @param bizTypeName{String} - 业务线
 * @param bizName{String} - 项目名
 * @param startTime{String} - 开始时间yyyy-MM-ddHH:mm:ss
 * @param endTime{String} - 结束时间yyyy-MM-ddHH:mm:ss
 * @param timeType{Number} - 时间标签. 比如1: 一天
 * @param measureType{Number} - 1：首屏均值，2：85th,3：90th,4：95th值
 * @param levelType{Number} - 1：优2：良好3：差
 */
export const getRankPagesTable = params => http.post(constant.PERFORMANCE.RANK_PAGES_TABLE, params);

/**
 * 性能统计 用户特征页面——获取用户清单
 * API介绍地址：http://api.baijia.com/mock/403/api/performance/analysis/feature/list/download
 * @param targetType{Number} - 性能指标类型. 比如1:首屏时间
 * @param bizTypeName{String} - 业务线
 * @param bizName{String} - 项目名
 * @param path{String} - 访问路径gaotumindex
 * @param startTime{String} - 开始时间yyyy-MM-ddHH:mm:ss
 * @param endTime{String} - 结束时间yyyy-MM-ddHH:mm:ss
 * @param timeType{Number} - 时间标签. 比如1: 一天
 * @param province{Array} - 省份
 * @param carrier{Array} - 运营商
 * @param netType{Array} - 网络环境
 * @param os{Array} - 操作系统
 * @param osVersion{Array} - 系统版本
 * @param brandVersion{Array} - 用户机型
 * @param levelType{Number} - 1：优2：良好3：差
 */
export const getUserList = (
    {
        targetType, bizTypeName, bizName, path, startTime, endTime, timeType,
        province, carrier, netType, os, osVersion, brandVersion, levelType, pager
    },
) => http.post(constant.PERFORMANCE.USER_FEATURE_USER_LIST, {
    targetType,
    bizTypeName,
    bizName,
    path,
    startTime,
    endTime,
    timeType,
    province,
    carrier,
    netType,
    os,
    osVersion,
    brandVersion,
    levelType,
    pager
});

/**
 * 用户特征页面——获取操作系统、运营商、网络环境等信息
 * API介绍地址：http://api.baijia.com/mock/403/api/performance/analysis/rank
 * url: /api/performance/corepage
 * @param targetType{Number} - 性能指标类型. 比如1:首屏时间
 * @param bizTypeName{String} - 业务线
 * @param bizName{String} - 项目名
 * @param path{String} - 访问路径
 * @param startTime{String} - 开始时间yyyy-MM-ddHH:mm:ss
 * @param endTime{String} - 结束时间yyyy-MM-ddHH:mm:ss
 * @param levelType{Number} - 1：优2：良好3：差
 * @param province{Array} - 省份
 * @param carrier{Array} - 运营商
 * @param netType{Array} - 网络环境
 * @param os{Array} - 操作系统
 * @param osVersion{Array} - 系统版本
 * @param brandVersion{Array} - 用户机型
 * @param field{String} - 请求的分组字段：比如：操作系统-os,系统版本-os_version,用户机型-brand_version,运营商-carrier,网络环境-net_type
 * @param top{Integer} - 求top多少，top10就传10，否则就不传
 * @param stringFilter{Object:{field:String,value:string}} - 用来过滤下钻的条件,字段是字符串的使用这个参数,[field=os,value=android] ,FilterStringFieldDTO
 * @param longFilter{Object:{field:String,value:long}} - 用来过滤下钻的条件,字段是整形的使用这个参数,[field=client_type,value=1] ,FilterLongFieldDTO
 */
export const getUserFeatureFields = (
    {
        targetType,
        bizTypeName,
        bizName,
        path,
        startTime,
        endTime,
        levelType,
        province,
        carrier,
        netType,
        os,
        osVersion,
        brandVersion,
        field,
        top,
        stringFilter,
        longFilter,
    },
) => http.post(constant.PERFORMANCE.USER_FEATURE_FIELD, {
    targetType,
    bizTypeName,
    bizName,
    path,
    startTime,
    endTime,
    levelType,
    province,
    carrier,
    netType,
    os,
    osVersion,
    brandVersion,
    field,
    top,
    stringFilter,
    longFilter,
});

/**
 * 获取用户「特征模块」的地域分布
 * @param params 参数对象.具体字段类型基本同上getUserFeatureFields
 * @returns {Promise}
 */
export const getUserFeatureArea = params => http.post(constant.PERFORMANCE.USER_FEATURE_AREA, params);

/**
 * 获取 业务线 - 应用 - 路径 下的指标重要性排序
 * @param bizTypeName{String}
 * @param bizName{String}
 * @param path{String}
 */
export const getImportanceList = params => http.post(constant.PERFORMANCE.IMPORTANCE_LIST, params);

/**
 * 应用管理
 * 用户配置: 查看已配置的应用
 * @param pageId{String} 配置页面id
 */
export const getBizReference = params => http.post(constant.PERFORMANCE.BIZ_REFERENCE, params);

/**
 * 用户配置: 查看已配置path-指标组合
 * @param pageId{String} 配置页面id
 */
export const getTargetPreference = params => http.post(constant.PERFORMANCE.TARGET_REFERENCE, params);

/**
 * 用户配置：添加路径-指标组合
 * @param pageId{String} 配置页面id
 * @param bizTypeName{String} 业务线
 * @param bizName{String} 项目
 * @param paths{Array} 路径列表
 * @param targetTypes{Array} 指标列表
 */
export const addPreference = params => http.post(constant.PERFORMANCE.ADD_REFERENCE, params);

/**
 * 用户配置：删除配置
 * @param bizId{String}
 * @param targetIdList{Array} 被删除id的list
 */
export const deleteTarget = params => http.post(constant.PERFORMANCE.DELETE_REFERENCE, params);

/**
 * 用户配置：业务线-应用组合重排序
 * @param pageId{Number}
 * @param bizIdList{Array} 排序好的list
 */
export const saveSortReference = params => http.post(constant.PERFORMANCE.SAVE_SORT_REFERENCE, params);

/**
 * 用户配置：路径-指标组合重排序
 * @param bizId{Number} 业务线
 * @param targetIdList{Array} 排序好的list
 */
export const saveSortTarget = params => http.post(constant.PERFORMANCE.SAVE_SORT_TARGET, params);

/**
 * 用户配置：路径-指标组合重排序
 * @param pageId{Number} 配置页面id
 */
export const getAllPreference = params => http.post(constant.PERFORMANCE.ALL_REFERENCE, params);

/**
 * 用户配置：查询是否有重复配置
 * @param pageId{String} 配置页面id
 * @param bizTypeName{String} 业务线
 * @param bizName{String} 项目
 * @param paths{Array} 路径列表
 * @param targetTypes{Array} 指标列表
 */
export const checkForDup = params => http.post(constant.PERFORMANCE.CHECK_DUPLICATE, params);

/**
 * 用户配置：查看页面下已配置的业务线
 * @param pageId{String} 配置页面id
 */
export const getPageBizList = params => http.post(constant.PERFORMANCE.PAGE_BIZ_LIST, params);
